package com.milo.base.math;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.Arrays;


/**
 * 使用三种方式演示java中保留2位小数
 * 包括 BigDecimal,
 * Math.round and DecimalFormat class.
 * @author milogenius
 */

public class RoundingNumbers {


    public static void main(String args[]) {

        //数据
        float[] samples = new float[]{2.123f, 2.125f, 2.127f};


        //使用 Match.round()保留2位小数
        float[] rounded = round(samples);


        System.out.println("开始舍入, numbers: "
                + Arrays.toString(samples));
        System.out.println("结束舍入 : 使用Match.round()方法 "
                + Arrays.toString(rounded));


        //使用BigDecimal保留2位小数
        //我们可以使用不同的舍入模式e.g., HALF_UP, HALF_DOWN,and HALF_EVEN with BigDecimal
        rounded = roundUsingBigDecimal(samples);


        System.out.println("开始舍入,numbers : "
                + Arrays.toString(samples));

        System.out.println("结束舍入, number 使用 BigDecimal: "
                + Arrays.toString(rounded));


        //DecimalFormat Example to round number to 2 digits
        //使用DecimalFormat来保留2位小数
        rounded = roundUsingDecimalFormat(samples);
        System.out.println("开始舍入numbers: "
                + Arrays.toString(samples));
        System.out.println("结束舍入,使用DecimalFormat: "
                + Arrays.toString(rounded));

    }


    /**
     *  使用 Math.round保留2为小数
     * @param numbers
     * @return
     */
    public static float[] round(float[] numbers) {

        float[] round = new float[numbers.length];
        for (int i = 0; i < numbers.length; i++) {
            float number = numbers[i];
            round[i] = (float) Math.round(number * 100) / 100;
        }
        return round;
    }

    /**
     * 使用BigDecimal保留2为小数
     * @param digits
     * @return
     */
    public static float[] roundUsingBigDecimal(float[] digits) {
        float[] result = new float[digits.length];
        for (int i = 0; i < digits.length; i++) {
            float digit = digits[i];
            result[i] = BigDecimal.valueOf(digit)
                    .setScale(2, BigDecimal.ROUND_HALF_DOWN)
                    .floatValue();
        }
        return result;
    }

    /**
     * 使用DecimalFormat保留2为小数
     * @param decimals
     * @return
     */
    public static float[] roundUsingDecimalFormat(float[] decimals) {
        float[] rounded = new float[decimals.length];
        //DecimalFormat to round numbers to 2 decimal place 
        DecimalFormat df = new DecimalFormat("#.00");
        for (int i = 0; i < decimals.length; i++) {
            float decimal = decimals[i];
            rounded[i] = Float.valueOf(df.format(decimal));
        }
        return rounded;
    }
}
